#pragma once

#include <tchar.h>
#include <windows.h>
#include <assert.h>

class CWinWnd;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CWinApp
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CWinApp
{
public:
	CWinApp(void);
	virtual ~CWinApp(void);

public:
	void	Run();

protected:
	virtual bool	InitInstance();

	virtual void	ExitInstance();

protected:
	CWinWnd*	m_pMainWnd;
};


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CWinWnd
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CWinWnd
{
public:
	CWinWnd(void);
	virtual ~CWinWnd(void);

public:
	void		ShowWindow(int nShowCmd);
	void		CenterWindow();
	void		DestroyWindow();


	bool		IsValid();
	
protected:
	HWND		Create(const TCHAR* szWndName, DWORD dwStyle, int x, int y, int cx, int cy, HWND hParent);
	LRESULT		FinalWndProc(HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam);

private:
	bool		_RegisterWindowClass();
	static
	LRESULT CALLBACK _WndProc(HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam);

protected:
	virtual	DWORD			GetClassStyle() const;
	virtual	const TCHAR*	GetClassName() const;
	virtual LRESULT			WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) = 0;


protected:
	HINSTANCE	m_hInstance;
	HWND		m_hWnd;
	
private:
	TCHAR	    m_szClassName[MAX_PATH];
	DWORD		m_dwClsStyle;

};